package com.example.demo.binary;

/**
 * 中文和二级制互转
 * <p>
 * 说明：<br>
 * 中文转二进制：先把中文转成char数组，每个中文字符都可以用char来表示，然后再把char转成int数据，在转成二进制。<br>
 * <p>
 * 二进制转中文：先把单个二进制转成int数据，int在转成char数据，char在转成字符。
 *
 * @author WangYX
 * @version 1.0.0
 * @date 2024/03/13 12:28
 */
public class ChineseToBinary {

    public static void main(String[] args) {
        String chinese = "你好，我是中国人";
        String binary = chineseToBinary(chinese);
        System.out.println(binary);


        String s = binaryStrToChinese(binary);
        System.out.println(s);
    }

    /**
     * 中文转二进制字符串
     *
     * @param chineseStr 中文字符串
     * @return String 二进制字符串 空格隔开每个字符
     */
    public static String chineseToBinary(String chineseStr) {
        //中文转char字符数组
        char[] chars = chineseStr.toCharArray();
        StringBuilder sl = new StringBuilder();
        for (char c : chars) {
            //char字符转二进制字符串
            String binaryString = Integer.toBinaryString(c);
            sl.append(binaryString);
            sl.append(" ");
        }
        return sl.toString().trim();
    }

    /**
     * 二进制字符串转中文
     *
     * @param binaryStr 二进制字符串 每个子串之间用空格隔开
     * @return String 中文字符串
     */
    public static String binaryStrToChinese(String binaryStr) {
        String[] split = binaryStr.split(" ");
        char[] chars = new char[split.length];
        for (int i = 0; i < split.length; i++) {
            chars[i] = binaryStrToChar(split[i]);
            //上面的逻辑和下面这行代码的逻辑是一样的
            //chars[i] =  (char)Integer.parseInt(split[i], 2);
        }
        return String.valueOf(chars);
    }

    /**
     * 将单个二进制字符串转为字符
     *
     * @param binaryStr 二进制字符串
     * @return char 中文字符
     */
    public static char binaryStrToChar(String binaryStr) {
        int[] temp = binaryStrToIntArray(binaryStr);
        int sum = 0;
        for (int i = 0; i < temp.length; i++) {
            //二进制转为十进制
            sum += temp[temp.length - 1 - i] << i;
        }
        return (char) sum;
    }

    /**
     * 二进制字符串转换成int数组
     *
     * @param binaryStr 二进制字符串
     * @return int[] int数组
     */
    public static int[] binaryStrToIntArray(String binaryStr) {
        char[] chars = binaryStr.toCharArray();
        int[] result = new int[chars.length];
        for (int i = 0; i < chars.length; i++) {
            //十进制48在ascii表示0
            result[i] = chars[i] - 48;
        }
        return result;
    }

}
